// 1. Promise如我们常用的那样，创建该实例时，会给它的构造函数一个函数作为参数
// 我们暂且把它称之为执行器executor
// 执行器executor有两个参数resolve和reject，这两个参数都是function，需要开发自己去调用
// 同时，这两个参数又代表了Promise对象三个状态中的两个
// pending 正在等待, resolve 解决, reject 拒绝
// 当我们的异步任务在executor执行，并未得到结果时，promise的状态为pending
// 当执行结果成功获取时，状态则变为resolve；反之，则变为reject
// resovle和reject分别有一个参数，对应成功后获取的数据及失败后的原因
// 还有最重要的一点就是，一旦状态从pending变成resolve或reject，该状态就不能改变了， 这个过程不可逆
const PENDING = 'pending';
const REJECT = 'reject';
const RESOLVE = 'resolve';
class MyPromise {
    status = PENDING
    resolve = value => {
        // 如果当前状态不是pending, 直接终止程序
        if (this.status !== PENDING) return;
        // 将状态改为resolve
        this.status = 'resolve';
        console.log("Current Status is ", this.status);
        console.log("Current value is ", value);
    }

    reject = reason => {
        // 如果当前状态不是pending, 直接终止程序
        if (this.status !== PENDING) return;
        // 将状态改为rejct
        this.status = 'reject';
        console.log("Current Status is ", this.status);
        console.log("Current reason is ", reason);
        
    }

    constructor(executor) {
        // 这里执行器中的参数是两个函数，但是在单独执行时内部没有指定上下文，所以需要进行绑定
        // 也可以用箭头函数，默认指向当前对象
        // executor(this.resolve.bind(this), this.reject.bind(this));
        executor(this.resolve, this.reject);
        
    }
}

module.exports = MyPromise;